package com.jzo2o.utils;

import cn.hutool.core.date.DatePattern;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import feign.QueryMapEncoder;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;

/**
 * Feign查询参数编码器，实现QueryMapEncoder接口
 * 功能：将请求参数对象序列化为Map<String, Object>，用于Feign生成URL查询参数
 * 特性：自定义LocalDateTime等时间类型的序列化格式（采用标准日期时间格式）
 */
public class MyQueryMapEncoder implements QueryMapEncoder {
    // 用于JSON序列化和反序列化的工具类，配置了自定义时间格式
    private static final ObjectMapper objectMapper = new ObjectMapper();

    /**
     * 将请求参数对象编码为查询参数字典（Map）
     * 实现逻辑：先将对象序列化为JSON字符串，再反序列化为Map，同时应用自定义时间格式
     * @param o 待转换的请求参数对象（如DTO、实体类等）
     * @return 转换后的键值对Map，用于Feign生成URL中的查询参数（key=value&key2=value2）
     * @throws RuntimeException 当序列化/反序列化失败时抛出
     */
    @Override
    public Map<String, Object> encode(Object o) {
        try {
            String s = objectMapper.writeValueAsString(o);
            return objectMapper.readValue(s, Map.class);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }


    // 静态初始化块：配置时间类型的序列化规则
    // 为LocalDateTime类型注册自定义序列化器，使用标准日期时间格式（如：yyyy-MM-dd HH:mm:ss）
    static {
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN);
        javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(dateTimeFormatter));

        objectMapper.registerModule(javaTimeModule);
    }
}
